/**
 * GlobalServer.h
 *
 *  Created on: 2009-04-17
 *      Author: Jacek Suchowski
 *
 * Klasa główna odpowieadająca za nasłuchiwanie na nadchodzące połączenia
 * i tworzenie nowych wątków dla każdego połączonego klienta
 */

#ifndef GLOBALSERVER_H_
#define GLOBALSERVER_H_

#include <pthread.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string>
#include <iostream>

#include "MacCollector.h"

namespace tftp_server
{
/**
 * @class GlobalServer
 * Klasa odpowiada za nasłuchiwanie na przychodzące połączenia i tworzenie nowych wątków dla kolejnych klientów
 */
class GlobalServer
{
	/**
	 * Port na którym działa gnizdo nasłuchu
	 */
	int port;
	/**
	 * Port na którym działa gnizdo do zmiany pliku konfiguracyjnego
	 */
	int configPort;
	/**
	 * Hasło do zmiany pliku konfiguracyjnego
	 */
	std::string configPassword;
	/**
	 * Gniazdo nasłuchu serwera
	 */
    int sock;
    /**
     * Tymczasowe gniazdo stworzone dla ostatniego odebranego połączenia od klienta
     */
    int tempSock;
    /**
     * Określa czy serwer będzie działał z włączonym MacCollectorem czy nie
     */
    bool isMacCollector;
    /**
     * Określa czy serwer będzie działał z włączonym ConfigChangerem czy nie
     */
    bool isConfigChanger;
    /**
     * Klasa odczytująca adresy MAC
     */
    MacCollector *macCollector;
public:
	/**
	 * Konstruktor głównego serwera
	 * @param port_ - Port na którym działa gnizdo nasłuchu
	 * @param configPort_ - Port na którym działa gnizdo do zmiany pliku konfiguracyjnego
	 * @param configPassword_ - Hasło do zmiany pliku konfiguracyjnego
	 * @param isMacCollector_ - Działanie z włączonym lub wyłączonym MacCollectorem
	 */
	GlobalServer(const int port_, int configPort_, std::string configPassword_, bool isMacCollector_, bool isConfigChanger_):port(port_), configPort(configPort_),configPassword(configPassword_),isMacCollector(isMacCollector_), isConfigChanger(isConfigChanger_) {};
    /**
     * Początek nasłuchiwania
     */
	void listen();
    /**
     * Destruktor zamykający sockety
     */
	virtual ~GlobalServer();

private:
	/**
     * Inicjalizacja serwera
     */
	void init();
};

}

#endif /* GLOBALSERVER_H_ */
